package com.课上案例练习.线程.线程安全.synchronized锁;


/**
 * 线程安全
 *
 * 如果有多个线程在同时运行，而这些线程可能同时运行这些代码，
 * 程序每次运行结果和单线程结果是一样的，而且其他的变量的值也和预期的是一样的，就是线程安全的。
 *
 * 线程同步
 *
 * 当多个线程访问同一个资源，且多线程中对资源有写的操作，就容易出现线程安全问题
 * Java提供同步机制解决
 *
 * 1.同步代码块
 * 2.同步方法
 * 3.锁机制和显示锁
 *
 *
 */
public class Test1 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread,"线程A");
        Thread thread2 = new Thread(myThread,"线程B");
          thread1.start();
          thread2.start();

    }
}
class MyThread implements Runnable{
     //票数
    private static Integer ticket=1000;
    //锁对象
    private  static Object object=new Object();



    /**
     * 出现重复卖，数据没有按照顺序卖
     *
     * 原因:
     * 线程执行到一半，cpu时间片到了，
     * 例如:
     * 线程A正在卖1
     * 线程B正在卖1
     *
     * 线程A 打印出来 还没开始减的情况下，cpu时间片到了
     * 导致线程B,打印出来，也是同样的
     */
//    @Override
//    public void run() {
//          while(true){
//              if(ticket<=0)
//              {
//                  System.out.println("卖完了");
//                  break;
//              }
//              System.out.println(Thread.currentThread().getName()+"正在卖"+(1001-ticket));
//              ticket--;
//          }
//    }
    /**
     * 解决方法，加上同步锁
     *让该线程执行完该方法，
     */
    @Override
    public void run() {
        while(true){
        synchronized (object){
            if(ticket<=0)
            {
                System.out.println("卖完了");
                break;
            }
            System.out.println(Thread.currentThread().getName()+"正在卖"+(1001-ticket));
            ticket--;
        }
          }
    }



}
